<?php

namespace CZan\Utils;


class Arrays
{
    /**
     * 二维数组去掉重复值
     * @param $array
     * @return array
     */
    public static function array_unique_fb($array): array
    {
        $out = array();
        foreach ($array as $key => $value) {
            if (!in_array($value, $out)) {
                $out[$key] = $value;
            }
        }
        return array_values($out);
    }

    /**
     * 获取一维数组的总合高精度
     * @param array $data
     * @return string
     */
    public static function array_bc_sum(array $data): string
    {
        $sum = '0';
        foreach ($data as $item) {
            $sum = bcadd($sum, (string)$item, 2);
        }
        return $sum;
    }

    /**
     * 返回数组中指定多列
     *
     * @param array $input 需要取出数组列的多维数组
     * @param String $column_keys 要取出的列名，逗号分隔，如不传则返回所有列
     * @param String $index_key 作为返回数组的索引的列
     *
     * @return array
     */
    public static function array_columns(array $input, $column_keys = null, $index_key = null): array
    {
        $result = [];

        $keys = isset($column_keys) ? explode(',', $column_keys) : [];

        if ($input) {
            foreach ($input as $v) {

                // 指定返回列
                if ($keys) {
                    $tmp = [];
                    foreach ($keys as $key) {
                        $tmp[$key] = $v[$key];
                    }
                } else {
                    $tmp = $v;
                }

                // 指定索引列
                if (isset($index_key)) {
                    $result[$v[$index_key]] = $tmp;
                } else {
                    $result[] = $tmp;
                }

            }
        }

        return $result;
    }

    /**
     * 多维数组递归合并
     */
    function multimerge()
    {
        $arrs = func_get_args();
        $merged = array();
        while ($arrs) {
            $array = array_shift($arrs);
            if (!$array) {
                continue;
            }
            foreach ($array as $key => $value) {
                if (is_string($key)) {
                    if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
                        $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value);
                    } else {
                        $merged[$key] = $value;
                    }
                } else {
                    $merged[] = $value;
                }
            }
        }
        return $merged;
    }

    /**
     * 数组转对象
     */
    function array2object($array)
    {
        return json_decode(json_encode($array, true), true);
    }

    /**
     * 对象转数组(高效)
     */
    function object2array($object)
    {
        return json_decode(json_encode($object, true), TRUE);
    }


}
